함수도 오브젝트 중 하나입니다.
예제를 위해 팩토리얼 함수를 만듭니다.
In [ ]:
def factorial(n):
sum = 1
for i in range(n, 1, -1):
sum *= i
return sum
In [ ]:
factorial(5)
위치 인자는 함수를 호출할 때 나열된 순서대로 할당됩니다.
In [ ]:
def factorial2(n, stop):
if n == 0:
return n, 1 # 팩토리얼 정의에 따라 0일 경우 1을 리턴합니다.
elif n < 0:
return n, None # 팩토리얼 정의에 따라 음수의 경우는 제외합니다.
sum = 1
for i in range(n, stop, -1):
sum *= i
return n, sum
In [ ]:
factorial2(5, 1)
In [ ]:
factorial2(0, 5)
In [ ]:
factorial2(-5 ,1)
키워드 인자는 위치 인자 뒤에 나열되어야 합니다.
In [ ]:
factorial2(n=5, stop=1)
In [ ]:
factorial2(stop=1, n=5)
In [ ]:
factorial2(stop=1, 5)
In [ ]:
factorial2(5, stop=1)
파라메타에 디폴트 값을 부여할 수 있습니다.
디폴트 값이 있는 파라메타는 함수 선언 맨 뒤에 위치해야 합니다.
In [ ]:
def factorial3(n, stop=1):
if n == 0:
return n, 1 # 팩토리얼 정의에 따라 0일 경우 1을 리턴합니다.
elif n < 0:
return n, None # 팩토리얼 정의에 따라 음수의 경우는 제외합니다.
sum = 1
for i in range(n, stop, -1):
sum *= i
return n, sum
In [ ]:
factorial3(n=5, stop=1)
In [ ]:
factorial3(n=5)
In [ ]:
factorial3(5)
In [ ]:
def factorial3(n=5, stop):
pass
재귀 함수는 종료 조건과 리턴 값의 갯수에 주의해야 합니다.
In [ ]:
def factorial4(n, stop=1):
if n < stop or n <= 0:
return 1
return n, n*factorial4(n-1, stop)
In [ ]:
factorial4(5, 4)
In [ ]:
def factorial4(n, stop=1):
if n < stop or n <= 0:
return 1
return n*factorial4(n-1, stop)
In [ ]:
factorial4(5, 4)
익명의 위치인자는 몇개의 인자가 전달될 지 확실히 알 수 없을 때 사용합니다.
In [ ]:
def menu(soup, main, *args):
print('Soup is %s' % soup)
print('Main is %s' % main)
for other in args:
print('Other is %s' % str(other))
In [ ]:
menu('mushroom', 'steak', 'wine', 100)
In [ ]:
menu('egg', 'wine', 100)
익명의 키워드 인자는 딕셔너리로 함수 내부에 전달됩니다.
In [ ]:
def menu(*args, **kwargs):
for other in args:
print('Order is %s' % str(other))
for k in kwargs:
print('Menu is %s: %s' % (k, kwargs[k]))
In [ ]:
menu('mushroom', drink='wine', tip=100)
함수 내부에서 참조하는 변수가 함수 내부에 없으면 전역 변수를 참조합니다.
In [ ]:
a = 'dog'
id(a)
In [ ]:
def f1():
print(id(a))
f1()
함수내에서 변수에 값이 할당되면 새로운 전역변수와는 구분됩니다.
In [ ]:
def f2():
a = 'cat'
print(id(a))
f2()
In [ ]:
id(a)
지역변수가 할당되기 전에 먼저 참조가 일어나면 에러가 발생합니다.
In [ ]:
def f3():
print(id(a))
a = 'cat'
f3()
명시적으로 전역변수를 사용하고 싶을 때에는 global 키워드를 이용합니다.
In [ ]:
def f4():
global a
print(id(a))
a = 'cat'
print(id(a))
f4()
In [ ]:
id(a)
파라메타로 전달되는 것은 오브젝트를 가리키는 참조입니다.(call-by-object-reference)
In [ ]:
a = 'dog'
def f5(a):
print(id(a))
a = 'cat'
print(id(a))
f5(a)
In [ ]:
id(a)
In [ ]:
a = ['dog']
id(a)
In [ ]:
def f6(a):
print(id(a))
a.append('cat')
print(id(a))
f6(a)
In [ ]:
a
내부함수는 함수 안에 함수를 정의하는 것 입니다.
In [ ]:
def outer():
def inner():
print('inner')
inner()
In [ ]:
outer()
In [ ]:
def inner():
print('global inner')
outer()
외부함수에서 넘겨진 인자값을 기억하는 함수를 만들어 리턴합니다.(클로저)
In [ ]:
def cookbook(name):
def recipe(no):
print("%s's recipe no.%d" % (name, no))
return recipe
In [ ]:
python_recipe = cookbook('python')
perl_recipe = cookbook('perl')
In [ ]:
python_recipe(1)
In [ ]:
perl_recipe(2)
In [ ]:
id(python_recipe), id(perl_recipe)
제너레이터는 큰 배열을 효율적으로 생성할 때 사용합니다.
In [ ]:
import random
def gaus_dist(n):
while n > 0:
yield random.random()
n -= 1
In [ ]:
gd = gaus_dist(5)
for i in gd:
print(i)
In [ ]:
gd = gaus_dist(5)
next(gd)
In [ ]:
next(gd)
In [ ]:
sum(gd)
In [ ]:
list(gaus_dist(5))
함수 바디 첫번째 라인의 주석은 독스트링으로 관리됩니다.
In [ ]:
def sample(a = 0):
'''this is sample function'''
pass
In [ ]:
sample?
In [ ]:
help(sample)